package com.stark.commons.spring.core.context;

import java.util.ArrayList;
import java.util.List;

import org.apache.commons.collections.CollectionUtils;
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;

import com.stark.commons.spring.core.support.sql.RoutingDataSource;

import lombok.Getter;
import lombok.Setter;

/**
 * 多数据源切换。
 * <p><strong>注意：</strong>调用 {@link RoutingDataSource#setDataSourceKey(String)} 切换数据源，
 * 业务处理完毕后务必调用 {@link RoutingDataSource#removeDataSourceKey()} 切回至切换前的数据源。
 * @author Ben
 * @since 1.0.0
 * @version 1.0.0
 */
public class DataSourceContextHolder extends AbstractRoutingDataSource {
	
	private static final ThreadLocal<List<String>> dataSourceKey = new ThreadLocal<>();
	
	@Getter @Setter
	private static String defaultKey;

    /**
     * 设置数据源。
     * @param dataSource 数据源标识。
     */
    public static void setDataSourceKey(String dataSource) {
		getDataSources().add(dataSource);
    }
    
    /**
     * 删除线程中的数据源标识，并切回至切换前的数据源。
     */
    public static void removeDataSourceKey() {
    	List<String> dataSources = getDataSources();
    	dataSources.remove(dataSources.size() - 1);
    }
    
    /**
     * 获取线程当前的数据源。
     * @return 当前的数据源。
     */
    public static String currDataSourceKey() {
    	List<String> dataSources = getDataSources();
        return CollectionUtils.isEmpty(dataSources) ? defaultKey : dataSources.get(dataSources.size() - 1);
    }

    @Override
    protected Object determineCurrentLookupKey() {
        return currDataSourceKey();
    }
    
    private static List<String> getDataSources() {
    	List<String> list = dataSourceKey.get();
    	if (list == null) {
    		list = new ArrayList<>();
    		dataSourceKey.set(list);
    	}
    	return list;
    }
    
}